/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

/**
 *
 * @author marco
 */
import java.sql.*;
import Logica.Accion;
import Logica.Usuario;
import java.util.LinkedList;

public class ADOAccion {

    private Singleton_Conexion datosconexion;
    Connection conexion;

    public ADOAccion() {
        try {
            Class.forName(datosconexion.getInstancia().getDriver());
            conexion = DriverManager.getConnection(datosconexion.getInstancia().getProtocolo());
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (java.sql.SQLException e1) {
            e1.printStackTrace();
        }
    }

    public boolean insertarAccion(Accion a, String reu, String proy) {
        String sentencia = "Insert Into accion (nombre,descripcion,nombre_usuario,fecha_Vencimiento,estadoActual,fecha_Creacion,nombre_reunion,nombre_proyecto) values(?,?,?,?,?,?,?,?)";
        PreparedStatement st;
        try {

            st = conexion.prepareStatement(sentencia);
            st.setString(1, a.getNombre());
            st.setString(2, a.getDescripcion());
            st.setString(3, a.getUsuario().getNombreUsuario());
            st.setString(4, a.getFechaVencimientoString());
            st.setInt(5, 1);
            st.setString(6, a.getFechaCreacionString());

            st.setString(7, reu);
            st.setString(8, proy);
            st.execute();
            st.close();
            return true;
        } catch (java.sql.SQLException e1) {
            e1.printStackTrace();
            return false;
        }

    }

    public LinkedList traerAcciones(int[] orden, int estado, String usuario, String proyecto) {
        ResultSet rs = null;
        LinkedList lista = new LinkedList();
        String vorden = " order by ";
        String apendEstado = "";
        String apendUsuario = "";

        /*
         * algoritmo para agregar el mutiple ordenamiento
         */
        if (orden[0] == 1) {
            vorden += "nombre_usuario";
            if (orden[1] == 1) {
                vorden += ",fecha_vencimiento";
            }
            if (orden[2] == 1) {
                vorden += ",nombre_reunion";
            }
        } else if (orden[1] == 1) {

            vorden += "fecha_vencimiento";
            if (orden[2] == 1) {
                vorden += ",nombre_reunion";
            }

        } else if (orden[2] == 1) {
            vorden += "nombre_reunion";//"r.nombre";
        }

        /*
         * si orden no viene con ningun param.. no deberia ordenar
         */
        if (orden[0] == 0 && orden[1] == 0 && orden[2] == 0) {
            vorden = "";
        }


        if (estado == 1) {
            apendEstado = " and estadoActual = 1 ";
        }
        if (!usuario.equals("todos")) {
            apendUsuario = "and nombre_usuario = '" + usuario + "'";//no parametrizada
        }
        if (orden[0] == 1) {
        }

        try {
            PreparedStatement st;
            String sentencia = "select *  from accion a where  nombre_proyecto = '" + proyecto
                    + "'" + apendEstado + " " + apendUsuario + " " + vorden;
            System.out.println(sentencia);
            st = conexion.prepareStatement(sentencia);
            rs = st.executeQuery();

            while (rs.next()) {
                Accion a = new Accion();
                a.setId(rs.getInt("id_accion"));
                a.setNombre(rs.getString(2));
                a.setDescripcion(rs.getString("descripcion"));
                a.setFechaCreacionInvertida(rs.getString("fecha_Creacion"));
                a.setFechaVencimientoInvertida(rs.getString("fecha_Vencimiento"));
                a.setEstado(rs.getInt("estadoActual"));
                ADOUsuario usr = new ADOUsuario();
                a.setUsuario(usr.buscarUsuarioPorId(rs.getString("nombre_usuario")));
                ADOReunion reu = new ADOReunion();

                a.setReunion(rs.getString("nombre_reunion"));


                lista.add(a);

            }

        } catch (java.sql.SQLException e1) {
            System.out.println("si");
            System.out.println(e1.toString());
        }
        return lista;
    }

    public boolean actualizarAccion(Accion a) {

        String sentencia = "UPDATE accion SET nombre=?, descripcion=?, nombre_usuario=?, fecha_vencimiento=?, nombre_reunion=?, estadoActual=? WHERE id_accion = ?";
        PreparedStatement st;
        try {

            st = conexion.prepareStatement(sentencia);
            st.setString(1, a.getNombre());
            st.setString(2, a.getDescripcion());
            st.setString(3, a.getUsuario().getNombreUsuario());
            st.setString(4, a.getFechaVencimientoString());
            st.setString(5, a.getReunion());
            st.setInt(6, a.getEstado());
            st.setInt(7, a.getId());
            st.execute();
            st.close();
            return true;
        } catch (java.sql.SQLException e1) {
            e1.printStackTrace();
            return false;
        }
    }

    public Connection getConexion() {
        return conexion;
    }

    public LinkedList traerAccionesAbiertasPorUsuario(Usuario usuario) {
        LinkedList accionesAbiertas = new LinkedList();
        ResultSet rs = null;
        try {
            PreparedStatement st;
            String sentencia = "select * from accion where nombre_usuario = '" + usuario.getNombreUsuario() + "' and estadoActual = 1";
            st = conexion.prepareStatement(sentencia);
            rs = st.executeQuery();
            while (rs.next()) {
                Accion a = new Accion();
                a.setId(rs.getInt("id_accion"));
                a.setNombre(rs.getString(2));
                a.setDescripcion(rs.getString("descripcion"));
                a.setFechaCreacionInvertida(rs.getString("fecha_Creacion"));
                a.setFechaVencimientoInvertida(rs.getString("fecha_Vencimiento"));
                a.setEstado(rs.getInt("estadoActual"));
                a.setUsuario(usuario);
                a.setProyecto(rs.getString("nombre_proyecto"));
                accionesAbiertas.add(a);
            }
            st.close();
        } catch (java.sql.SQLException e1) {
            System.out.println(e1.toString());
        }

        return accionesAbiertas;
    }

    public LinkedList traerTodasLasAcciones() {
        ResultSet rs = null;
        LinkedList lista = new LinkedList();
        try {
            PreparedStatement st;
            String sentencia = "select * from accion a";
            System.out.println(sentencia);
            st = conexion.prepareStatement(sentencia);
            rs = st.executeQuery();

            while (rs.next()) {
                Accion a = new Accion();
                a.setId(rs.getInt("id_accion"));
                a.setNombre(rs.getString(2));
                a.setDescripcion(rs.getString("descripcion"));
                a.setFechaCreacionInvertida(rs.getString("fecha_Creacion"));
                a.setFechaVencimientoInvertida(rs.getString("fecha_Vencimiento"));
                a.setEstado(rs.getInt("estadoActual"));
                ADOUsuario usr = new ADOUsuario();
                a.setUsuario(usr.buscarUsuarioPorId(rs.getString("nombre_usuario")));
                a.setReunion(rs.getString("nombre_reunion"));
                a.setProyecto(rs.getString("nombre_proyecto"));
                lista.add(a);
            }

        } catch (java.sql.SQLException e1) {
            System.out.println("si");
            System.out.println(e1.toString());
        }
        return lista;
    }
        public boolean actualizarUsuarioEnAccion(int id, String nombreUsuario) {

        String sentencia = "UPDATE accion SET nombre_usuario=? WHERE id_accion = ?";
        PreparedStatement st;
        try {

            st = conexion.prepareStatement(sentencia);
            st.setString(1, nombreUsuario);
            st.setInt(2, id);
            st.execute();
            st.close();
            return true;
        } catch (java.sql.SQLException e1) {
            e1.printStackTrace();
            return false;
        }
    }
}
